package com.uva.dbcs.gestionDeReservaAlquiler.persistencia.impl;

import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.uva.dbcs.gestionDeReservaAlquiler.dominio.Alquiler;
import com.uva.dbcs.gestionDeReservaAlquiler.persistencia.AlquilerDAO;
import com.uva.dbcs.utilidades.persistencia.GenericAbstractDAO;

/**
 * Session Bean implementation class AlquilerDAOImpl
 */
@Stateless
public class AlquilerDAOImpl extends GenericAbstractDAO<Alquiler, Integer>
		implements AlquilerDAO {

	@PersistenceContext
	private EntityManager entityManager;

	public AlquilerDAOImpl() {
		super(Alquiler.class);
	}

	@Override
	public EntityManager getEntityManager() {
		return entityManager;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Alquiler> findAlquileres(List<Integer> listaIdsVehiculos,
			Date fechaInicio, Date fechaFin) {

		// tenemos que construir la quuery dinamicamente en jpql
		StringBuilder sb = new StringBuilder();
		boolean estaListaIdsVehiculos = false;
		boolean estafechaInicio = false;
		boolean estafechaFin = false;

		sb.append("select a FROM Alquiler a where 1=1 ");

		if (listaIdsVehiculos != null && listaIdsVehiculos.size()>0) {
			sb.append(" and a.idVehiculo in :listaIdsVehiculos  ");
			estaListaIdsVehiculos = true;
		}

		if (fechaInicio != null && fechaFin == null) {
			sb.append(" and a.fechaFin < :fechaInicio ");
			estafechaInicio = true;

		} else if (fechaFin != null && fechaInicio == null) {

			sb.append("  and a.fechaInicio >= :fechaFin ");
			estafechaFin = true;

		} else if (fechaInicio == null && fechaFin == null) {
			// no añadimos nada

		} else if (fechaInicio != null && fechaFin != null) {
			sb.append(" and ((a.fechaFin > :fechaInicio and a.fechaFin <:fechaFin )")
					.append(" or (a.fechaInicio > :fechaInicio and a.fechaFin < :fechaInicio)")
					.append(" or (a.fechaInicio < :fechaInicio and a.fechaFin > :fechaFin))");
			estafechaInicio = true;
			estafechaFin = true;

		}

		Query query = getEntityManager().createQuery(sb.toString(), Alquiler.class);
		
		if (estaListaIdsVehiculos){
			query.setParameter("listaIdsVehiculos", listaIdsVehiculos);
		}
		if (estafechaInicio){
			query.setParameter("fechaInicio", fechaInicio);
		}
		if (estafechaFin){
			query.setParameter("fechaFin", fechaFin);
		}

		
		return query.getResultList();
	}

}
